// class Solution {
// public:
//     vector<int> productExceptSelf(vector<int>& nums) {
//         int length = nums.size();
//         vector<int> answer;
//         vector<int> L(length);
//         vector<int> R(length);
//         L[0] = nums[0];
//         for (int i = 1; i < length; i++) {
//             L[i] = L[i - 1] * nums[i];
//         }
//         R[length - 1] = nums[length - 1];
//         for (int i = length - 2; i >= 0; i--) {
//             R[i] = R[i + 1] * nums[i];
//         }
//         for (int i = 0; i < length; i++) {
//             if (i == 0)
//                 answer.push_back(R[i + 1]);
//             else if (i == length - 1)
//                 answer.push_back(L[length - 2]);
//             else
//                 answer.push_back(L[i - 1] * R[i + 1]);
//         }
//         return answer;
//     }
// };

class Solution {
public:
    vector<int> productExceptSelf(vector<int>& nums) {
        int length = nums.size();
        vector<int> answer(length);
        answer[0] = 1;
        for (int i = 1; i < length; i++) {
            answer[i] = answer[i - 1] * nums[i - 1];
        }
        int R = nums[length - 1];
        for (int i = length - 2; i >= 0; i--) {
            answer[i] *= R;
            R *= nums[i];
        }
        return answer;
    }
};